#include<stdio.h>
#include<string>
#include<deque>
#include<algorithm>
#include<iostream>
#include<vector>
using namespace std;


//内部：是一个动态的二维数组
//双端队列
//双端数组，可以对头部进行插入和删除
//与vector 不同，vector 进行头插与头删除，效率非常慢
//访问效率较低
//迭代器支持随机访问


//输出
//void pringDeque(const deque<int>& d) //const 只读
//{
//	for (auto i = d.begin();i != d.end();i++)
//	{
//		cout << *i << " ";
//	}
//	cout << endl;
//}
//
////初始化
//void test()
//{
//	deque<int>d1;
//	for (int i = 0;i < 10;i++)
//	{
//		d1.push_back(i);
//	}
//	pringDeque(d1);
//	
//	deque<int>d2(d1.begin(), d1.end());
//	pringDeque(d2);
//}
//int main()
//{
//	test();
//	return 0;
//}


//deque赋值操作
//void pringDeque(const deque<int>& d) //const 只读
//{
//	for (auto i = d.begin();i != d.end();i++)
//	{
//		cout << *i << " ";
//	}
//	cout << endl;
//}




//void test()
//{
//	deque<int>d1;
//	for (int i = 0;i < 10;i++)
//	{
//		d1.push_back(i);
//	}
//	pringDeque(d1);
//
//	//operator =赋值
//	deque<int>d2;
//	d2 = d1;
//	pringDeque(d2);
//
//	//assign赋值
//	deque<int>d3;
//	d3.assign(d1.begin(), d1.end());
//	pringDeque(d3);
//
//
//	deque<int>d4;
//	d4.assign(10, 100);
//	pringDeque(d4);
//}
//int main()
//{
//	test();
//	return 0;
//}



//deque容器大小操作
//deque赋值操作
//void pringDeque(const deque<int>& d) //const 只读
//{
//	for (auto i = d.begin();i != d.end();i++)
//	{
//		cout << *i << " ";
//	}
//	cout << endl;
//}
//void test()
//{
//	deque<int>d1;
//	for (int i = 0;i < 10;i++)
//	{
//		d1.push_back(i);
//	}
//	pringDeque(d1);
//
//	if (d1.empty())
//	{
//		cout << "d1为空" << endl;
//	}
//	else
//	{
//		cout << "d1不为空" << endl;
//		cout << "d1的大小为：" << d1.size() << endl;
//		//deque容器没有容量的概念
//
//	}
//	//重新指定大小
//	d1.resize(15);
//	d1.resize(15, 1); //多出来的容量放1
//	pringDeque(d1);
//
//	d1.resize(5);
//	pringDeque(d1);//多出来的数据会被删除
//}
//int main()
//{
//	test();
//	return 0;
//}
//
//

//deque插入和删除

//void pringDeque(const deque<int>& d) //const 只读
//{
//	for (auto i = d.begin();i != d.end();i++)
//	{
//		cout << *i << " ";
//	}
//	cout << endl;
//}
//
//void test()
//{
//	deque<int>d;
//
//	//尾插
//	d.push_back(10);
//	d.push_back(19);
//
//	//头插
//	d.push_front(100);
//	d.push_front(120);
//	pringDeque(d);
//
//	//尾删
//	d.pop_back();
//	pringDeque(d);
//
//	//头删
//	d.pop_front();
//	pringDeque(d);
//}
//void test02()
//{
//	deque<int>d2;
//	d2.push_back(10);
//	d2.push_back(20);
//	d2.push_front(100);
//	d2.push_front(200);
//	pringDeque(d2);
//
//	//200 100 10 20
//
//	//insert插入
//	d2.insert(d2.begin(), 1000);
//	pringDeque(d2);
//
//	//按照区间进行插入
//	deque<int>d3;
//	d3.push_back(1);
//	d3.push_back(2);
//	d3.push_back(3);
//
//	d2.insert(d2.begin(), d3.begin(), d3.end());
//	pringDeque(d2);
//
//
//}
//int main()
//{
//	//test();
//
//	test02();
//	return 0;
//}


//插入和删除的位置都是迭代器


//deque容器数据存取
//void test()
//{
//	deque<int>d;
//	d.push_back(1);
//	d.push_back(2);
//	d.push_front(3);
//	d.push_front(4);
//
//	//通过[]方式访问元素
//	//300 200 100 10 20 30
//	for (int i = 0;i < d.size();i++)
//	{
//		cout << d[i] << " ";
//	}
//	cout << endl;
//
//	//通过at方式访问元素
//	for (int i = 0;i < d.size();i++)
//	{
//		cout << d.at(i) << " ";
//	}
//	cout << endl;
//
//	cout << "第一个元素为： " << d.front() << endl;
//	cout << "最后一个元素为： " << d.back() << endl;
//
//	//除了使用迭代器获取deque容器中的元素，[]和at也可以
//	//front返回容器第一个元素
//	//back返回容器最后一个元素
//}
//





//利用算符对deque容器进行排序

//void printDeque(const deque<int>& d)
//{
//	//1.迭代器
//	for (auto i = d.begin();i != d.end();i++)
//		cout << *i << " ";
//	cout << endl;
//
//
//	//范围for
//	/*for (auto i : d)
//		cout << i << " ";
//	cout << endl;*/
//}
//int main()
//{
//	deque<int>d{ 12,3,5,6,2,4 };	
//	cout << "排序前的deque是： ";
//	printDeque(d);
//	
//	//sort(d.begin(), d.end()); //默认是升序
//	//对于支持随机访问的迭代器的容器， 都可以利用sort算法直接对其进行排序	
//
//	sort(d.begin(), d.end(), greater<int>()); //降序 需要加一个greater<int>()
//
//	cout << "排序后的deque是: ";
//	printDeque(d);
//}

//deque的内存分配时，不需要赋值所有的数据，而vect在内存重新分配时需要复制

//效率比较快，头插和尾插的时间复杂度都是O（1）

//动态创建二维数组的方式（掌握）

//迭代器属于随机访问迭代器

//下标操作不扩容，防止误操作，利用插入类都可以自动扩容
//无法保证数据的连续性
//间隔式的插入是不可能的事情，因为迭代器到不了那里
//void Show(const deque<int>& d)
//{
//	for (auto it = d.begin();it != d.end();it++)
//		cout << *it << " ";
//	cout << endl;
//}
//int main()
//{
//	deque<int>d;
//	for (int i = 0;i < 5;i++)
//	{
//		d.push_back(i);
//	}
//	Show(d);
//	d.pop_back();
//	Show(d);
//	return 0;
//}





#include <stdio.h>
#include <stdlib.h>

//#include <stdio.h>
//#include <stdlib.h>
//
//int main() {
//    int rows, cols;
//
//    // 获取用户输入的行数和列数
//    printf("Enter the number of rows: ");
//    scanf("%d", &rows);
//    printf("Enter the number of columns: ");
//    scanf("%d", &cols);
//
//    // 动态分配内存
//    int** matrix = (int**)malloc(rows * sizeof(int*));
//    if (matrix == NULL) {
//        printf("Memory allocation failed.\n");
//        return 1;
//    }
//    for (int i = 0; i < rows; ++i) {
//        matrix[i] = (int*)malloc(cols * sizeof(int));
//        if (matrix[i] == NULL) {
//            printf("Memory allocation failed.\n");
//            // 释放之前已分配的内存
//            for (int j = 0; j < i; ++j) {
//                free(matrix[j]);
//            }
//            free(matrix);
//            return 1;
//        }
//    }
//
//    // 初始化数组
//    for (int i = 0; i < rows; ++i) {
//        for (int j = 0; j < cols; ++j) {
//            matrix[i][j] = i * cols + j; // 可以根据需要进行初始化
//        }
//    }
//
//    // 打印数组
//    printf("The 2D array:\n");
//    for (int i = 0; i < rows; ++i) {
//        for (int j = 0; j < cols; ++j) {
//            printf("%d\t", matrix[i][j]);
//        }
//        printf("\n");
//    }
//
//    // 释放内存
//    for (int i = 0; i < rows; ++i) {
//        free(matrix[i]);
//    }
//    free(matrix);
//
//    return 0;
//}




















































